/**
 * ReportGear(2011)
 */
package com.reportgear.report.model.calculator;

import com.reportgear.report.model.ReportModel;

/**
 * 计算辅助 类
 * 
 * @version 1.0 2011-4-19
 * @author <a herf="lexloo@gmail.com">lexloo</a>
 * @since Report 1.0
 */
public class CalculatorHelper {
	/**
	 * 计算薪酬报表
	 * 
	 * @param model
	 *            待计算的模型
	 */
	public static ReportModel calculateSalaryReportModel(ReportModel model) {
		ReportModel calcModel = model.clone();

//		MessageWindow.INSTANCE.show("报表计算中,请等待...");
		// 计算参数
		CalcParameter parameter = new CalcParameter();
		parameter.calculate(calcModel);
		
		// 计算参数(当前不要计算参数,下次计算参数的时候注意有些参数不要计算)
		// calcModel = new ParameterCalculator().calculate(calcModel, false);
		// 清理空单元格
		calcModel = new ClearCalculator().calculate(calcModel, parameter);
		// 计算发放表信息
		calcModel = new PayInfoCalculator().calculate(calcModel, parameter);
		// 计算公式
		calcModel = new FormulaCalculator().calculate(calcModel, parameter);
		// 汇总表计算
		// 计算工资对象
		calcModel = new SalaryObjectCalculator().calculate(calcModel, parameter);
		// 计算工资对象分组
		calcModel = new SalaryObjectGroupCalculator().calculate(calcModel, parameter);
		// 计算薪酬数据格定义
		calcModel = new CrossDataObjectCalculator().calculate(calcModel, parameter);
		// 计算薪酬数据格
		calcModel = new CrossDataObjectValueCalculator().calculate(calcModel, parameter);
		// 明细表计算
		// 计算明细对象
		calcModel = new MainDetailObjectCalculator().calculate(calcModel, parameter);
		// 计算薪酬档案格定义
		calcModel = new CrossDocDataObjectCalculator().calculate(calcModel, parameter);
		// 计算薪酬档案
		calcModel = new CrossDocDataObjectValueCalculator().calculate(calcModel, parameter);
		// 计算薪酬档案分组
		calcModel = new CrossDocDataObjectValueGroupCalculator().calculate(calcModel, parameter);
		// 计算明细薪酬数据格定义
		calcModel = new CrossDetailDataObjectCalculator().calculate(calcModel, parameter);
		// 计算明细薪酬数据格
		calcModel = new CrossDetailDataObjectValueCalculator().calculate(calcModel, parameter);

//		MessageWindow.INSTANCE.hide();
		
		return calcModel;
	}
}
